package com.pic.mgt.utils;

import com.pic.mgt.log.Log;

public abstract class LogUtils {
	/**
	 * 針對輸出層級為 Trace ，可以交由本方式來執行，
	 * 同時會將例外訊息內容連串成為一個字串.
	 * @param logObj 輸出 log 的類別
	 * @param logger
	 * @param cause
	 */
	public static void trace(Object logObj, Log logger, Throwable cause) {
		String message = concatThrowableCausesMessage(cause);
		logger.trace(logObj, message);
	}
	
	/**
	 * 針對輸出層級為 Trace ，可以交由本方式來執行，
	 * 同時會將例外訊息內容連串成為一個字串.
	 * @param logObj 輸出 log 的類別
	 * @param logger
	 * @param message
	 * @param cause
	 */
	public static void trace(Object logObj, Log logger, String message, Throwable cause) {
		String finalMessage = concatThrowableCausesMessage(message, cause);
		logger.trace(logObj, finalMessage);
	}
	
	/**
	 * 針對輸出層級為 Debug ，可以交由本方式來執行，
	 * 同時會將例外訊息內容連串成為一個字串.
	 * @param logObj 輸出 log 的類別
	 * @param logger
	 * @param cause
	 */
	public static void debug(Object logObj, Log logger, Throwable cause) {
		String message = concatThrowableCausesMessage(cause);
		logger.debug(logObj, message);
	}
	
	/**
	 * 針對輸出層級為 Debug ，可以交由本方式來執行，
	 * 同時會將例外訊息內容連串成為一個字串.
	 * @param logObj 輸出 log 的類別
	 * @param logger
	 * @param message
	 * @param cause
	 */
	public static void debug(Object logObj, Log logger, String message, Throwable cause) {
		String finalMessage = concatThrowableCausesMessage(message, cause);
		logger.debug(logObj, finalMessage);
	}
			
	/**
	 * 針對輸出層級為 Info 的狀況，可以交由本方式來執行，
	 * 同時會將例外訊息內容連串成為一個字串.
	 * @param logObj 輸出 log 的類別
	 * @param logger
	 * @param cause
	 */
	public static void info(Object logObj, Log logger, Throwable cause) {
		String message = concatThrowableCausesMessage(cause);
		logger.info(logObj, message);
	}
	
	/**
	 * 針對輸出層級為 Info 的狀況，可以交由本方式來執行，
	 * 同時會將例外訊息內容連串成為一個字串.
	 * @param logObj 輸出 log 的類別
	 * @param logger
	 * @param message
	 * @param cause
	 */
	public static void info(Object logObj, Log logger, String message, Throwable cause) {
		String finalMessage = concatThrowableCausesMessage(message, cause);
		logger.info(logObj, finalMessage);
	}
		
	/**
	 * 針對輸出層級為 Warn 的狀況，可以交由本方式來執行，
	 * 同時會將例外訊息內容連串成為一個字串.
	 * @param logObj 輸出 log 的類別
	 * @param logger
	 * @param cause
	 */
	public static void warn(Object logObj, Log logger, Throwable cause) {
		String message = concatThrowableCausesMessage(cause);
		logger.warn(logObj, message);
	}
	
	/**
	 * 針對輸出層級為 Warn 的狀況，可以交由本方式來執行，
	 * 同時會將例外訊息內容連串成為一個字串.
	 * @param logObj 輸出 log 的類別
	 * @param logger
	 * @param message
	 * @param cause
	 */
	public static void warn(Object logObj, Log logger, String message, Throwable cause) {
		String finalMessage = concatThrowableCausesMessage(message, cause);
		logger.warn(logObj, finalMessage);
	}
	
	/**
	 * 針對輸出層級為 error 的Log,並會將例外訊息內容連串成為一個字串.
	  * @param logObj 輸出 log 的類別
	 * @param logger
	 * @param cause
	 */
	public static void error(Object logObj, Log logger, Throwable cause) {
		String message = concatThrowableCausesMessage(cause);
		logger.error(logObj, message);
	}
	
	/**
	 * 針對輸出層級為 error 的Log,並會將例外訊息內容連串成為一個字串.
	 * @param logObj 輸出 log 的類別
	 * @param logger
	 * @param message
	 * @param cause
	 */
	public static void error(Object logObj, Log logger, String message, Throwable cause) {
		String finalMessage = concatThrowableCausesMessage(message, cause);
		logger.error(logObj, finalMessage);
	}

	
	/**
	 * 將 Exception 的錯誤訊息全部串成為一個字串
	 * @param cause
	 * @return
	 */
	private static String concatThrowableCausesMessage(Throwable cause) {
		return concatThrowableCausesMessage(null, cause);
	}
	
	/**
	 * 將 Exception 的錯誤訊息全部串成為一個字串
	 * @param message
	 * @param cause
	 * @return
	 */
	private static String concatThrowableCausesMessage(String message,
														Throwable cause) {
		StringBuffer stringBuffer = new StringBuffer();
		
		if (null != message) {
			stringBuffer.append(" : " + message);
		}
		
		while(cause != null) {
			stringBuffer.append(" : " + cause.getMessage());
			cause = cause.getCause();
		}
		
		return stringBuffer.toString().substring(3);
	}
}
